const { forEachOf } = require("async")

// promise 基本用法
const promise = new Promise(function(resolve, reject){
    // foo()
    // throw new Errow('error')
    resolve(100)

    // reject(new Error("promise rejected"))
})
// promise.then(function(value){
//     console.log('resolved', value)
// }, function(error){
//     console.log('rejected', error)
// }) 

// console.log('end')


// 链式调用
// let promise2 = promise.then(function(value){
//     console.log('resolved', value)
// }, function(error){
//     console.log('rejected', error)
// }) .then(function(value){
//     console.log('resolved', value)
// }, function(error){
//     console.log('rejected', error)
// }) .then(function(value){
//     console.log('resolved', value)
// }, function(error){
//     console.log('rejected', error)
// }) 

// console.log(promise2 === promise)

// promise.then(function(value){
//     console.log('resolved', value)
// }).catch(error => {
//     console.log("error", error)
// })

// Promise 静态方法 Promise.resolve() Promise.reject()
// 三种是等价的   有thenable接口的函数
// Promise.resolve('f00').then( value => {
//     console.log('resolve', value)
// })
// Promise.resolve({
//     then: (onFulfilled, onRejected) => {
//         onFulfilled('f00')
//     }
// }).then(value => {
//     console.log(value)
// })
// new Promise((resolve, reject) => {
//     resolve('f00')
// }).then(value => {
//     console.log('new', value)
// })


// Promise.reject(new Error('rejected')).catch(error => {
//     console.log('error', error)
// })




// promise 并行执行 all()方法 race()方法


// Promise 执行时序 / 宏任务 微任务
// console.log('global start')
// setTimeout(()=>{
//     console.log('setTimeout1')
// }, 1000)
// setTimeout(()=>{
//     console.log('setTimeout')
// }, 100)
// Promise.resolve().then(()=>{
//     console.log('promise')
// }).then(()=>{
//     console.log('promise1')
// })
// console.log('global end')



// Generator异步方案
// function *foo(){
//     console.log("start")
//     try{
//         const res = yield 'foo'
//         console.log(res, 'res')
//     }catch(e){
//         console.log(e, 'e')
//     }
   
// }
// const generator = foo()
// const result = generator.next()
// console.log(result, 'result')
// generator.next('bar')
// generator.throw(new Error('Generator Error'))
 
// 管理异步流程 体验Generator 函数异步方案

function *main(){
    try{
        const users = yield promise
        console.log('users', users)
    
        const posts = yield Promise.resolve(200)
        console.log(posts, 'posts')
    }catch(e){
        console.log(e)
    }
    
}


// const g = main()
// const result = g.next()

// result.value.then(data => {
//     const result2 = g.next(data)
//     if(result2.done) return
//     result2.value.then(data => {
//         g.next(data)
//     })
// })

// 递归执行Generator函数
// const g = main()
// function handleResult (result){
//     if(result.done) return 
//     result.value.then(data => {
//         handleResult(g.next(data))
//     }, error => {
//         g.throw(error)
//     })
// }
// handleResult(g.next())
function co(generator){
    const g = generator()
    function handleResult (result){
        if(result.done) return 
        result.value.then(data => {
            handleResult(g.next(data))
        }, error => {
            g.throw(error)
        })
    }
    handleResult(g.next())
}
co(main)


// async await
async function mainSync(){
    try{
        const users = await promise
        console.log('users', users)
    
        const posts = await Promise.resolve(200)
        console.log(posts, 'posts')
    }catch(e){
        console.log(e)
    }
    
}
const mains = mainSync()
mains.then(()=>{
    console.log('all completed')
})




















